package com.smart.community.payment.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.smart.community.commons.base.BaseEntity;
import com.smart.community.commons.enums.SystemStatusEnum;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 支付实体类
 * 
 * @author Wu.Liang
 * @version 1.0.0
 * @since 2025-06-26
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sc_payment_order")
public class Payment extends BaseEntity {

    private static final long serialVersionUID = 1L;

    /**
     * 用户ID
     */
    @TableField("user_id")
    private Long userId;

    /**
     * 社区ID
     */
    @TableField("community_id")
    private Long communityId;

    /**
     * 支付订单号
     */
    @TableField("order_no")
    private String orderNo;

    /**
     * 支付金额
     */
    @TableField("amount")
    private BigDecimal amount;

    /**
     * 支付方式：1-微信支付，2-支付宝，3-银行卡，4-现金
     */
    @TableField("payment_method")
    private Integer paymentMethod;

    /**
     * 支付状态：1-待支付，2-支付中，3-支付成功，4-支付失败，5-已取消
     */
    @TableField("status")
    private Integer paymentStatus;

    /**
     * 业务类型：property_fee-物业费，sanitation_fee-卫生费，gas_fee-燃气费，utility_fee-水电费
     */
    @TableField("business_type")
    private String businessType;

    /**
     * 业务ID
     */
    @TableField("business_id")
    private Long businessOrderId;

    /**
     * 支付时间
     */
    @TableField("paid_time")
    private LocalDateTime paymentTime;

    /**
     * 支付描述
     */
    private String description;

    /**
     * 支付渠道编码
     */
    private String channelCode;

    /**
     * 第三方支付订单号
     */
    private String thirdPartyOrderNo;

    /**
     * 退款金额
     */
    private BigDecimal refundAmount;

    /**
     * 退款原因
     */
    private String refundReason;

    /**
     * 退款时间
     */
    private LocalDateTime refundTime;

    /**
     * 检查是否可以关闭
     * 
     * @return 是否可以关闭
     */
    public boolean canClose() {
        return paymentStatus != null && (paymentStatus.equals(SystemStatusEnum.DISABLED.getCode()) || 
               paymentStatus.equals(SystemStatusEnum.LOCKED.getCode())); // 待支付或支付失败可以关闭
    }

    /**
     * 检查是否可以重新支付
     * 
     * @return 是否可以重新支付
     */
    public boolean canRepay() {
        return paymentStatus != null && (paymentStatus.equals(SystemStatusEnum.DISABLED.getCode()) || 
               paymentStatus.equals(SystemStatusEnum.LOCKED.getCode())); // 待支付或支付失败可以重新支付
    }

    /**
     * 检查是否可以退款
     * 
     * @return 是否可以退款
     */
    public boolean canRefund() {
        return paymentStatus != null && paymentStatus.equals(SystemStatusEnum.ENABLED.getCode()); // 只有支付成功才能退款
    }

    /**
     * 检查是否已退款
     * 
     * @return 是否已退款
     */
    public boolean isRefunded() {
        return paymentStatus != null && paymentStatus.equals(SystemStatusEnum.DELETED.getCode()); // 已退款状态
    }

    /**
     * 获取支付方式名称
     * 
     * @return 支付方式名称
     */
    public String getPaymentMethodName() {
        if (paymentMethod == null) return "未知";
        switch (paymentMethod) {
            case 1: return "微信支付";
            case 2: return "支付宝";
            case 3: return "银行卡";
            case 4: return "余额";
            default: return "未知";
        }
    }

    /**
     * 获取业务类型名称
     * 
     * @return 业务类型名称
     */
    public String getBusinessTypeName() {
        if (businessType == null) return "未知";
        switch (businessType) {
            case "property_fee": return "物业费";
            case "sanitation_fee": return "卫生费";
            case "gas_fee": return "燃气费";
            case "utility_fee": return "水电费";
            default: return "其他";
        }
    }

    /**
     * 获取支付状态名称
     * 
     * @return 支付状态名称
     */
    public String getPaymentStatusName() {
        return SystemStatusEnum.getByCode(paymentStatus).getDescription();
    }

    /**
     * 格式化金额显示
     * 
     * @return 格式化后的金额
     */
    public String getFormattedAmount() {
        if (amount == null) return "0.00";
        return amount.setScale(2, BigDecimal.ROUND_HALF_UP).toString();
    }

    /**
     * 格式化退款金额显示
     * 
     * @return 格式化后的退款金额
     */
    public String getFormattedRefundAmount() {
        if (refundAmount == null) return "0.00";
        return refundAmount.setScale(2, BigDecimal.ROUND_HALF_UP).toString();
    }
}
